/* 
typeof: 
  在js中typeof用来获取一个表达式的类型名称, 可以通过打印来查看
  在ts中typeof用来用于获取一个变量或者属性的类型
    用来ts的类型检查
    不能通过打印查看, 如果用打印查看, 就是js的typeof
*/
(() => {
  
  /* 在js中typeof用来得到数据的类型名称  string */
  const person = {
    name: 'tom',
    age: 12
  }
  function fn (x: number): string {
    return x + 'abc'
  }
  /* 在TS中, 如果去打印typeof结果, 就会转换为js的typeof运行 */
  console.log(typeof person) //  'object'
  console.log(typeof person.name) // 'string'
  console.log(typeof fn) // 'function'

  // 在TS中, 使用typeof不用于打印结果时, 它得到的是数据的类型
  typeof person.name  // 得到是string这个类型, 而不是它的类型名称

  // 要定义一个与person.name类型一样的变量
  let a: typeof person.name = 'abc'
  // a = 123  // error
  // 要定义一个与person类型一样的变量
  let b: typeof person = {
    name: 'xxx',
    age: 23
  }
  type Name = typeof person.name
  let a2: Name = 'sss'
  type Person = typeof person
  let b2: Person = {
    name: 'yyy',
    age: 23
  }

  let fn2: typeof fn = function (a: number): string {
    return 'abc'
  }

})()